package excel导出为vcf;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class ExcelToUserUI implements ActionListener {

	JFrame f = new JFrame("Excel导出联系人");
	JButton btin = new JButton("选择文件");// 选择excel文件按钮
	JButton btout = new JButton("选择文件夹");
	JButton submit = new JButton("确定");
	JTextField tin = new JTextField(15);// 选择excel
	JTextField tout = new JTextField(15);// 输出路径
	JTextField tname = new JTextField(7);// name
	JTextField tphone = new JTextField(7);// phone
	JFileChooser jfc = new JFileChooser();// 文件选择器
	JTextArea t = new JTextArea();// 输出控制台
	JScrollPane jsp = new JScrollPane(t);

	JMenuItem i1 = new JMenuItem("使用注意");
	JMenuItem i2 = new JMenuItem("反馈给作者");

	// 下面两行是取得屏幕的高度和宽度
	double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
	double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();

	public static void main(String[] args) {
		new ExcelToUserUI().MainFrame();
	}

	public void MainFrame() {

		f.setLayout(new BorderLayout());

		JPanel p = new JPanel();
		p.setLayout(new BorderLayout());

		// menu配置
		JMenuBar menu = new JMenuBar();
		JMenu m1 = new JMenu("选项");
		menu.add(m1);

		m1.add(i1);
		m1.add(i2);

		// 添加主frame
		f.add(menu, BorderLayout.NORTH);
		f.add(p, BorderLayout.CENTER);

		// 配置次级panel
		JPanel p1 = new JPanel();
		p1.setLayout(new BorderLayout());// ////////刚才缺了这一行代码，其他的都对

		t.setBorder(BorderFactory.createTitledBorder("输出信息："));

		// 下方选择输出路径
		JPanel p4 = new JPanel();
		p1.add(p4, BorderLayout.NORTH);
		p4.setLayout(new FlowLayout());
		p4.add(new JLabel("保存到:"));
		p4.add(tout);
		p4.add(btout);
		p4.add(submit);

		// 添加总的panel
		p.add(p1, BorderLayout.NORTH);
		p.add(p4, BorderLayout.SOUTH);
		p.add(jsp, BorderLayout.CENTER);

		// 上方选择文件
		JPanel p2 = new JPanel();
		p1.add(p2, BorderLayout.NORTH);
		p2.setLayout(new FlowLayout());
		p2.add(new JLabel("选择Excel文件:"));
		p2.add(tin);
		p2.add(btin);

		// 中间填写行
		JPanel p3 = new JPanel();
		p1.add(p3, BorderLayout.SOUTH);
		p3.setLayout(new FlowLayout());
		p3.add(new JLabel("姓名所在单元格:"));
		p3.add(tname);
		p3.add(new JLabel("手机号所在单元格:"));
		p3.add(tphone);

		// f.setBounds(400, 200, 400, 300);
		f.setLocation(new Point((int) (lx / 2) - 150, (int) (ly / 2) - 150));// 设定窗口出现位置
		f.setSize(400, 300);
		f.setResizable(false);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);

		btin.addActionListener(this);
		btout.addActionListener(this);
		submit.addActionListener(this);
		i1.addActionListener(this);
		i2.addActionListener(this);

		jfc.setCurrentDirectory(new File("C://"));// 设置初始位置

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource().equals(btin)) {
			jfc.setFileSelectionMode(0);// 设定只能选择到文件
			int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句
			if (state == 1) {
				return;// 撤销则返回
			} else {
				File f = jfc.getSelectedFile();// f为选择到的文件
				tin.setText(f.getAbsolutePath());
			}
		}
		if (e.getSource().equals(btout)) {// 判断触发方法的按钮是哪个
			jfc.setFileSelectionMode(1);// 设定只能选择到文件夹
			int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句
			if (state == 1) {
				return;// 撤销则返回
			} else {
				File f = jfc.getSelectedFile();// f为选择到的目录
				tout.setText(f.getAbsolutePath() + "\\member.vcf");
			}
		}
		if (e.getSource().equals(submit)) {

			if (!checkInput()) {
				return;
			}
			// 初始化
			t.setText("");
			// 得到excel
			String fpath = tin.getText();
			t.append("选择excel路径：" + fpath + "\n");
			// 得到姓名和手机号所在单元格
			String sname = tname.getText();
			String sphone = tphone.getText();

			t.append("excel中第一个姓名所在单元格坐标：" + sname + "\n");
			t.append("excel中第一个手机号所在单元格坐标：" + sphone + "\n");
			// 得到输出路径
			String foutpath = tout.getText();

			t.append(">_<正在操作,请稍后...\n");

			try {

				int[] istr = transInput(sname, sphone);
				// core操作
				System.out.println(istr[0] + istr[1] + istr[2]);
				Map<String, String> map = ReadExcelToVcard.ReadAndOut(fpath,
						istr[1] -1, istr[2] - 1 , istr[0] - 1, foutpath);

				t.append("文件生成成功！！！\n文件输出信息为：\n\n");
				
				int i = 1;
				for (String key : map.keySet()) {
					t.append((i++) + " " + key + " : " + map.get(key) + "\n");
				}

				t.append("文件已输出到：" + foutpath + "\n");
			} catch (Exception ex) {
				t.append("操作失败！！！\n请检查填入信息是否正确，重启后再试！\n");
				t.append("可能的原因:\n");
				t.append(ex.getMessage() + "\n");
				ex.printStackTrace();
			}

		}
		if (e.getSource().equals(i1)) {
			howToUse();
		}
		if (e.getSource().equals(i2)) {
			returnToAuthor();
		}
	}

	// 检查输入问题
	public boolean checkInput() {
		if (tin.getText() == null || tin.getText().equals("")) {
			JOptionPane.showMessageDialog(null, "请选择excel文件！！！");
			return false;
		} else if (tout.getText() == null || tout.getText().equals("")) {
			JOptionPane.showMessageDialog(null, "请选择文件输出路径！！！");
			return false;
		} else if (tphone.getText() == null || tphone.getText().equals("")) {
			JOptionPane.showMessageDialog(null, "请填入手机号码所在列名！！！");
			return false;
		} else if (tname.getText() == null || tname.getText().equals("")) {
			JOptionPane.showMessageDialog(null, "请填入姓名所在列名！！！");
			return false;
		}
		return true;
	}

	/**
	 * 返回int[] i1=inRow,i2=iname,i3=iphone
	 * 
	 * @param sname
	 * @param sphone
	 * @return
	 * @throws Exception
	 */
	private int[] transInput(String sname, String sphone) throws Exception {

		String name = sname.trim();
		String phone = sphone.trim();

		if ( !Character.isLetter(name.charAt(0))
				|| !Character.isLetter(phone.charAt(0))) {
			throw new Exception("输入的姓名和电话号码所在位置的格式不对！\n请重新输入！\n例：B2,C2;F3,H3");
		}

		int inRow;
		int inameRow;
		int iphoneRow;
		
		try {
			 inameRow = Integer.parseInt(name.trim().substring(1));
			 iphoneRow = Integer.parseInt(phone.trim().substring(1));
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("输入的姓名和电话号码所在位置的格式不对！\n请重新输入！\n例：B2,C2;F3,H3");
		}

		if(inameRow != iphoneRow)
			throw new Exception("输入的姓名和电话号码所在位置的格式不对！\n请重新输入！\n例：B2,C2;F3,H3");
		
		inRow = inameRow;
		
		System.out.println("inRow:" + inRow);
		int iname = name.toUpperCase().charAt(0) - 'A' + 1;
		System.out.println("iname:" + iname);
		int iphone = phone.toUpperCase().charAt(0) - 'A' + 1;
		System.out.println("iphone:" + iphone);
		return new int[] { inRow, iname, iphone };

	}

	private void howToUse() {
		JFrame fr = new JFrame();
		fr.setTitle("使用注意");
		JTextArea jt = new JTextArea();
		JScrollPane jp = new JScrollPane(jt);
		jt.setEditable(false);
		jt.setLineWrap(true);

		jt.setText("");
		jt.append("1.该软件还在开发中,因此需要导入的excel格式必须严格符合格式：\n");
		jt.append("① excel中需要没有空单元格。\n");
		jt.append("②姓名和电话号码必须对齐在同一行。\n");
		jt.append("③不建议使用c盘作为输出地址。因为c盘涉及到电脑权限问题，所以有时输出文件可能为空。\n");
		jt.append("2.导出的文件后缀名必须为vcf，这样安卓手机才能识别并自动导入。\n");
		jt.append("3.此软件默认在手机号前加 “+86”，如果不是中国手机号请自行修改。\n");
		jt.append("4.在导出完成后，您可以用电脑将该vcf文件发送到手机上，并用手机打开，");
		jt.append("手机会自动识别并导入。\n");
		jt.append("5.单元格请填写正确，如b2,c3等。\n");
		jt.append("6.使用时请确保姓名和手机号两列没有其他数据！！否则软件可能会导出失败！\n");
		jt.append("7.如果一直出错，可以尝试一下只将姓名和手机号复制到新建excel中，并且只粘贴值。");
		jt.append("8.感谢您使用此软件，如有问题可向作者反馈，我会尽量为您处理。\n");

		// fr.setBounds(400, 200, 300, 200);
		fr.setLocation(new Point((int) (lx / 2) - 150, (int) (ly / 2) - 150));// 设定窗口出现位置
		fr.setSize(400, 200);
		fr.add(jp);
		fr.setVisible(true);
		fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	private void returnToAuthor() {
		JFrame j = new JFrame("反馈");
		j.setLayout(new GridLayout(6, 1));

		JLabel jl1 = new JLabel("作者qq:", JLabel.LEFT);
		JLabel jl2 = new JLabel("505306581", JLabel.LEFT);
		JLabel jl3 = new JLabel();
		JLabel jl4 = new JLabel("制作时间：2015-09-11", JLabel.RIGHT);
		JLabel jl5 = new JLabel("版权所有，违版必究", JLabel.CENTER);
		JLabel jl6 = new JLabel("感谢使用本软件！！！\n");

		j.add(jl6);
		j.add(jl1);
		j.add(jl2);
		j.add(jl3);
		j.add(jl4);
		j.add(jl5);

		j.setLocation(new Point((int) (lx / 2) - 150, (int) (ly / 2) - 150));// 设定窗口出现位置
		j.setSize(200, 150);
		// j.setBounds(400, 200, 200, 150);
		j.setVisible(true);
		j.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

}
